package indi.kider.server.bill.service;

import indi.kider.common.model.apabus.Rent;
import indi.kider.common.model.bill.*;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.ResponseEntity;
import pers.vankid.common.utils.page.PageRequest;
import pers.vankid.common.utils.page.PageResponse;

import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * Created by shixj on 2018/5/4.
 */
public interface BillService {
    //结算

    /**
     * 结算 （后台自动结算专用）
     *
     * @return
     */
    void balance();

    /**
     * 结算水
     * 结算电
     * 结算租金等
     *
     * @param balanceTask
     * @param isEnd       是否注销任务（退租）
     * @return
     */
    Bill balance(BalanceTask balanceTask, Boolean isEnd);

    /**
     * 押金退还冲账
     *
     * @param rentId
     * @return
     */
    Bill backDeposit(Long rentId);
    /**
     * 结算租金
     *
     * @param isEnd       是否注销任务（退租）
     * @param balanceTask
     * @return
     */
    Bill balanceRental(BalanceTask balanceTask, Boolean isEnd);

    /**
     * 结算网费
     *
     * @param isEnd       是否注销任务（退租）
     * @param balanceTask
     * @return
     */
    Bill balanceNet(BalanceTask balanceTask, Boolean isEnd);

    /**
     * 结算公摊
     *
     * @param isEnd       是否注销任务（退租）
     * @param balanceTask
     * @return
     */
    Bill balanceShare(BalanceTask balanceTask, Boolean isEnd);

    /**
     * 结算物业
     *
     * @param isEnd       是否注销任务（退租）
     * @param balanceTask
     * @return
     */
    Bill balanceEstate(BalanceTask balanceTask, Boolean isEnd);


    /**
     * 结算水/电
     *
     * @param isEnd       是否注销任务（退租）
     * @param balanceTask
     * @return
     */
    Bill balanceWaterOrPower(BalanceTask balanceTask, Boolean isEnd);

    List<Bill> query(Bill balanceTask);

    PageResponse<List<Bill>> query(PageRequest<Bill> request);

    Bill queryOne(Long billId);

    /**
     * 更新支付状态
     *
     * @param billPay
     * @return
     */
    void updatePayStatus(BillPay billPay);

    /**
     * 客户端删除账单显示
     *
     * @param billId
     */
    void updateState(Long billId);

    /**
     * 手动增加账单
     *
     * @param bill
     * @return
     */
    Bill add(Bill bill);

    /**
     * 获取未支付账单总计
     */

    BillTotal getTotalUnpayed(Long billAttribution);

    /**
     * 根据租房信息查询租房信息和账单
     *
     * @param request
     * @return
     */
    PageResponse<RentBill> queryRentBill(PageRequest<RentBill> request);

    /**
     * 按房间
     * @param request
     * @return
     */

    PageResponse<RentBill> queryRentBillByHouse(PageRequest<RentBill> request);

    /**
     * 按租客
     * @param request
     * @return
     */
    PageResponse<RentBill> queryRentBillByTenant(PageRequest<RentBill> request);
    /**
     * 查账单明细
     * @param request
     * @return
     */
    PageResponse<RentBill> queryDayBillByRentId(PageRequest<RentBill> request);
    /**
     * 查账单总金额
     * @param request
     * @return
     */
    RentBill queryDayBillSumByRentId(RentBill request);
    /**
     * 根据租房信息查询租房信息和账单
     * 导出
     * @param rentBill
     * @return
     */
    ResponseEntity<InputStreamResource> exportRentBill(RentBill rentBill) throws IOException ;
    /**
     * 公寓管理员获取租客缴费信息及租房信息
     *
     * @param request
     * @return
     */

    PageResponse<List<RentBillCount>> getRentBillCountPage(PageRequest<RentBillCountQuery> request);

    /**
     * 公寓管理员获取相关支付账单
     *
     * @param request
     * @return
     */

    PageResponse<List<Bill>> getEnterpriseBills(PageRequest<RentBillCountQuery> request);

    /**
     * 财务月统计
     * 当前月数据
     *
     * @param enterpriseId
     * @return
     */
    BillMonthReport getEmployeeBillCountNow(Long enterpriseId);
    /**
     * 首页统计显示
     *
     * @param enterpriseId
     * @return
     */
    Map getHomePageCnt(Long enterpriseId);

    /**
     * 财务月统计
     * 分页查询含当前月
     *
     * @param request
     * @return
     */
    PageResponse<List<BillMonthReport>> getEmployeeBillCountPage(PageRequest<String> request);

    /**
     * 每月1号生成上月财务月统计
     */
    void insertEmployeeBillCount();

    /**
     * 结算押金
     *
     * @param rent
     * @return
     */
    Bill balanceDeposit(Rent rent);

    /**
     * 结算初始租金
     *
     * @param taskRegist
     * @return
     */
    Bill balanceInitRental(TaskRegist taskRegist);

    /**
     * 结算押金和初始租金
     *
     * @param taskRegist
     */
    void balanceInitBill(TaskRegist taskRegist);

    /**
     * 查询房间所有账单
     *
     * @param request
     * @return
     */
    PageResponse<List<Bill>> getBillListByHouseId(PageRequest<HousesBillQuery> request);

    /**
     * 后台更新账单状态
     */
    void updatePayStateAndBillSate(Long[] idArray, String remark);

    /**
     * 结算账单 注销任务
     */
    void balanceAllBills(Long rentId);

    /**
     * 获取租客所有已租未租总计
     *
     * @param rentId
     * @return
     */
    TenantBillFinalCount getTenantBillFinalCount(Long rentId);

    /**
     * 按类别、时间统计账单支付总额
     * 每月后台定时调用
     */

    void saveBillCountByTypeModelList();

    /**
     * 登录用户 按类别、时间统计账单支付总额
     */

    BillCountByTypeModel getBillCountByTypeAndUserModel(BillCountByTypeQuery query);

    /**
     * 登录用户 获取某年 按类别、月份统计账单支付总额
     */

    List<BillCountByTypeModel> getBillCountByTypeAndUserModelListByYear(BillCountByTypeQuery query);



}
